vlwkaos' digital garden

JavaScript - Memory Management

Javascript는 값이 초기화될 때 메모리를 할당한다. 더이상 해당 메모리를 사용하지 않는 경우 해제하는데, 다른 고급 언어처럼 Garbage Collector(GC)를 이용하여 메모리가 사용중인지 가늠하고 정리한다.

GC의 가장 기본적인 작동 방식은 참조를 하고 있는지를 확인하는 것이다.

Reference-counting Garbage Collection

그래서 가장 간단한 형태의 GC는 단순히 참조가 되는지를 일일히 확인한다. 이를 Reference-counting Garbage Collection이라고 한다.

이 방식의 문제점은 두개 이상의 오브젝트가 서로를 참조할 때 발생한다. 서로가 서로를 참조하는 순환 참조(Circular Reference)상황이 오면 GC는 두 오브젝트가 더이상 사용되지 않더라도 참조가 남아있기 때문에 메모리 할당이 아직 필요하다고 판단하여 메모리 누수가 발생한다.

Mark-and-sweep algorithm

참조가 있느냐를 판단하기 보다 도달이 가능한지를 판단하여 GC를 실행하는 방식이다. 참조를 시작하는 루트 오브젝트로부터 도달할 수 없는 경우 메모리에서 해제하기 때문에 순환 참조 문제가 발생하지 않는다.

이 방식의 단점은 강제로 메모리를 해제하고 싶을 때 그럴 수 없다는 점이다. 원하는 오브젝트를 버리고 싶을 때 위의 알고리즘에 부합하도록 명시적으로 도달 불가능하게 만들어야한다.

JavaScript - Memory Management